home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / security / log_tcp_6.0alpha.shar / tcpd.c < prev    next >
C/C++ Source or Header  |  1993-07-02  |  3KB  |  123 lines

  1.  /*
  2.   * General front end for stream and datagram IP services. This program logs
  3.   * the remote host name and then invokes the real daemon. For example,
  4.   * install as /usr/etc/{tftpd,fingerd,telnetd,ftpd,rlogind,rshd,rexecd},
  5.   * after saving the real daemons in the directory "/usr/etc/...". This
  6.   * arrangement requires that the network daemons are started by inetd or
  7.   * something similar. Connections and diagnostics are logged through
  8.   * syslog(3).
  9.   * 
  10.   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  11.   */
  12.  
  13. #ifndef lint
  14. static char sccsid[] = "@(#) tcpd.c 1.4 93/03/07 22:47:32";
  15. #endif
  16.  
  17. /* System libraries. */
  18.  
  19. #include <sys/types.h>
  20. #include <sys/param.h>
  21. #include <sys/stat.h>
  22. #include <stdio.h>
  23. #include <syslog.h>
  24.  
  25. extern char *strrchr();
  26. extern char *strcpy();
  27.  
  28. #ifndef MAXPATHNAMELEN
  29. #define MAXPATHNAMELEN    BUFSIZ
  30. #endif
  31.  
  32. /* Local stuff. */
  33.  
  34. #include "patchlevel.h"
  35. #include "log_tcp.h"
  36.  
  37. /* The following specifies where the vendor-provided daemons should go. */
  38.  
  39. #ifndef REAL_DAEMON_DIR
  40. #define REAL_DAEMON_DIR    "/usr/etc/..."
  41. #endif
  42.  
  43. int     log_severity = SEVERITY;    /* run-time adjustable */
  44.  
  45. main(argc, argv)
  46. int     argc;
  47. char  **argv;
  48. {
  49.     struct from_host from;
  50.     int     from_stat;
  51.     char    path[MAXPATHNAMELEN];
  52.  
  53.     /* Attempt to prevent the creation of world-writable files. */
  54.  
  55. #ifdef DAEMON_UMASK
  56.     umask(DAEMON_UMASK);
  57. #endif
  58.  
  59.     /*
  60.      * If argv[0] is an absolute path name, ignore REAL_DAEMON_DIR, and strip
  61.      * argv[0] to its basename.
  62.      */
  63.  
  64.     if (argv[0][0] == '/') {
  65.     strcpy(path, argv[0]);
  66.     argv[0] = strrchr(argv[0], '/') + 1;
  67.     } else {
  68.     sprintf(path, "%s/%s", REAL_DAEMON_DIR, argv[0]);
  69.     }
  70.  
  71.     /*
  72.      * Open a channel to the syslog daemon. Older versions of openlog()
  73.      * require only two arguments.
  74.      */
  75.  
  76. #ifdef LOG_MAIL
  77.     (void) openlog(argv[0], LOG_PID, FACILITY);
  78. #else
  79.     (void) openlog(argv[0], LOG_PID);
  80. #endif
  81.  
  82.     /*
  83.      * Find out and verify the remote host name. Sites concerned with
  84.      * security may choose to refuse connections from hosts that pretend to
  85.      * have someone elses host name.
  86.      */
  87.  
  88.     from_stat = fromhost(&from);
  89. #ifdef PARANOID
  90.     if (from_stat == -1)
  91.     refuse(&from);
  92. #endif
  93.  
  94.     /*
  95.      * The BSD rlogin and rsh daemons that came out after 4.3 BSD disallow
  96.      * socket options at the IP level. They do so for a good reason. Let's
  97.      * follow their example.
  98.      */
  99.  
  100. #ifdef KILL_IP_OPTIONS
  101.     fix_options(&from);
  102. #endif
  103.  
  104.     /*
  105.      * Check whether this host can access the service in argv[0]. The
  106.      * access-control code invokes optional shell commands as specified in
  107.      * the access-control tables.
  108.      */
  109.  
  110. #ifdef HOSTS_ACCESS
  111.     if (!hosts_access(argv[0], &from))
  112.     refuse(&from);
  113. #endif
  114.  
  115.     /* Report remote client and invoke the real daemon program. */
  116.  
  117.     syslog(log_severity, "connect from %s", hosts_info(&from));
  118.     (void) execv(path, argv);
  119.     syslog(LOG_ERR, "%s: %m", path);
  120.     clean_exit(&from);
  121.     /* NOTREACHED */
  122. }
  123.